/*
		strlen、strcpy、strcat函数的模拟实现

		夏思成

		2024年4月1日

		西科大15号公寓楼
*/

//strlen函数的模拟实现

//法1：计数器

//#include <stdio.h>
//#include <assert.h>
//size_t my_strlen(const char* p1)
//{
//  assert(p1);
//	int count = 0;
//	while (*p1++)
//	{
//		count++;
//	}
//	return count;
//}
//
//int main()
//{
//	char arr[] = "abc\0def";
//
//	size_t len = my_strlen(arr);
//
//	printf("%zd\n", len);
//	return 0;
//}


////法2：不创建临时变量(递归法)
//
//#include <stdio.h>
//#include <assert.h>
//
//size_t my_strlen(const char* p1)
//{
//	assert(p1);
//
//	if (!*p1)
//	{
//		return 0;
//	}
//	else
//	{
//		return 1 + my_strlen(p1+1);
//	}
//}
//
//int main()
//{
//	char arr[] = "abcdef";
//
//	size_t len = my_strlen(arr);
//	printf("%zd\n", len);
//	return 0;
//}

//
////法3：指针-指针
//
//#include <stdio.h>
//#include <assert.h>
//
//size_t my_strlen(const char* p1)
//{
//	assert(p1);
//
//	char* ret = (char*)p1;
//	while (*ret++)
//	{
//		;
//	}
//	ret--;
//	return ret - p1;
//}
//
//int main()
//{
//	char arr[] = "abcdef";
//
//	size_t len = my_strlen(arr);
//	printf("%zd\n", len);
//	return 0;
//}


////strcpy函数的模拟实现
//
//#include <stdio.h>
//#include <assert.h>
//
//char* my_strcpy(char* destination, const char* source)
//{
//	assert(destination && source);
//
//	char* ret = destination;
//	while (*destination++ = *source++)
//	{
//		;
//	}
//	return ret;
//}
//
//int main()
//{
//	char arr1[20] = "abcdef";
//	char arr2[] = "xxxxxxxxxx";
//
//	char* ret = my_strcpy(arr1, arr2);
//	printf("%s\n", ret);
//	return 0;
//}



//strcat函数的模拟实现

#include <stdio.h>
#include <assert.h>

char* my_strcat(char* destination, const char* source)
{
	assert(destination && source);

	char* ret = destination;

	while (*destination)
	{
		destination++;
	}

	while (*destination++ = *source++)
	{
		;
	}

	return ret;
}

int main()
{
	char arr1[30] = "abcdef";
	char arr2[] = "ghijk";

	char* ret = my_strcat(arr1, arr2);
	printf("%s\n", ret);
	return 0;
}